package Misc;
import java.util.*;
/**
The array is divided into four sections: 
a[1..Lo-1] zeroes
a[Lo..Mid-1] ones 
a[Mid..Hi] unknown
a[Hi+1..N] twos
If array [mid] =0, then swap array [mid] with array [low] and increment both pointers once.
If array [mid] = 1, then no swapping is required. Increment mid pointer once.
If array [mid] = 2, then we swap array [mid] with array [high] and decrement the high pointer once.
For more information on the Dutch national flag algorithm refer https://en.wikipedia.org/wiki/Dutch_national_flag_problem
*/
public class Sort012D {
    public static void main(String args[]) {
        Scanner np = new Scanner(System.in);
        int n = np.nextInt();
        int a[] = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = np.nextInt();
        }
        sort012(a);}

   public static void sort012(int[]a){
            int l = 0;
            int h = a.length - 1;
            int mid = 0;
            int temp ;
            while (mid <= h) {
                switch (a[mid]) {
                    case 0: {
                        temp = a[l];
                        a[l] = a[mid];
                        a[mid] = temp;
                        l++;
                        mid++;
                        break;}
                    case 1:
                        mid++;
                        break;
                    case 2: {
                        temp = a[mid];
                        a[mid] = a[h];
                        a[h] = temp;
                        h--;
                        break;
                    }
                }
            }
          System.out.println("the Sorted array is ");
          for (int i = 0; i < a.length; i++)
              System.out.print(+a[i] + " "); }
}
